/*
 * Configuracion.h
 *
 *  Created on: 13/10/2011
 *      Author: pablo
 */

#ifndef CONFIGURACION_H_
#define CONFIGURACION_H_

#include <map>
#include <string>
#include <list>
#include <tinyxml.h>
#include "ConfiguracionBasica.h"
#include "ConfiguracionLogs.h"
#include "TipoEstatico.h"
#include "TipoDinamico.h"
#include "TipoError.h"
#include "Usuario.h"

class Configuracion {
private:
	ConfiguracionBasica basica;
	ConfiguracionLogs logs;
	std::map<std::string , TipoEstatico*> estaticos;
	std::map<std::string , TipoDinamico*> dinamicos;
	std::map<int , TipoError*> errores;
	std::map<std::string , Usuario*> usuarios;
public:
	Configuracion();
	~Configuracion();

	void setConfiguracionBasica(ConfiguracionBasica config);
	void setConfiguracionLogs(ConfiguracionLogs config);

	bool agregarTipoEstatico(TipoEstatico* tipoEstatico);
	bool agregarTipoDinamico(TipoDinamico* tipoDinamico);
	bool agregarError(TipoError* tipoError);
	bool agregarUsuario(Usuario* usuario);

	bool removerTipoEstatico(const std::string& extension);
	bool removerTipoDinamico(const std::string& extension);
	bool removerError(int codigo);
	bool removerUsuario(const std::string& nombre);

	std::string getTipoEstatico(const std::string& extension);
	std::string getTipoDinamico(const std::string& extension);
	std::string getError(int codigo);
	std::string getPassUsuario(const std::string& nombreUsuario);
	ConfiguracionBasica getConfiguracionBasica() const;
	ConfiguracionLogs getConfiguracionLogs() const;

	std::list<TipoEstatico> getTiposEstaticos() const;
	std::list<TipoDinamico> getTiposDinamicos() const;
	std::list<Usuario> getUsuarios() const;
	std::list<TipoError> getTiposErrores() const;

	void cargarDesde(const std::string& path);
	void guardarComo(const std::string& path);
private:
	void liberarRecursosDinamicos();
	void liberarRecursosEstaticos();
	void liberarRecursosUsuarios();
	void liberarRecursosErrores();
	void cargarUsuarios(TiXmlElement *doc);
	void cargarErrores(TiXmlElement *doc);
	void cargarTiposDinamicos(TiXmlElement *doc);
	void cargarTiposEstaticos(TiXmlElement *doc);
	void cargarConfiguracionBasica(TiXmlElement *doc);
	void cargarLogs(TiXmlElement* nodo);
	void agregarUsuarios(TiXmlElement*& doc);
	void agregarErrores(TiXmlElement *& doc);
	void agregarTiposDinamicos(TiXmlElement *& doc);
	void agregarTiposEstaticos(TiXmlElement *& doc);
	void agregarConfiguracionBasica(TiXmlElement *& doc);
	void agregarLogs(TiXmlElement*& nodo);
	void agregarDeclaracionXml(TiXmlDocument & doc);
};

#endif /* CONFIGURACION_H_ */
